//cal.js
//获取应用实例
var rpn = require("../../utils/rpn.js");
var app = getApp()
Page({
    data: {
        id1: "clear",
        id2: "(",
        id3: ")",
        id4: "+",
        id5: "9",
        id6: "8",
        id7: "7",
        id8: "-",
        id9: "6",
        id10: "5",
        id11: "4",
        id12: "×",
        id13: "3",
        id14: "2",
        id15: "1",
        id16: "÷",
        id17: "0",
        id18: ".",
        id19: "history",
        id20: "=",
        screenData: "0",
        isResult: false,
        tempLog: '',
        logs: []
    },
    //事件处理函数
    onLoad: function() {

    },
    onReady: function() {

    },
    onShow: function() {

    },
    onHide: function() {

    },
    onUpload: function() {

    },
    history: function() {
        wx.navigateTo({
            url: '../list/list'
        })
    },
    clickButton: function(event) {
        var data = this.data.screenData.toString();
        var id = event.target.id;
        var tempLog = '';
        var dataTail = data.charAt(data.length - 1);
        if (this.data.isResult) data = '0';
        this.setData({
            isResult: false
        })
        // C键，清空
        if (id == this.data.id1) {
            data = 0;
            tempLog = '';
            this.setData({
                lastIsOperator: false
            });
        }
        // 算数符键
        else if ('+-×÷*/'.indexOf(id) > -1) {
            // 如果式子以负号结尾，肯定是算数负
            if (data.length > 1)
                // 如果接在运算符、正括号后面，减号视做负号
                if (id == this.data.id8 && '+-×÷*/('.indexOf(dataTail) > -1) {
                    // 式子是一个零，或者本身被视为负号                    
                    if (data == '0' ||
                        (dataTail == '-' &&
                            data.length > 2 &&
                            '+-×÷*/('.indexOf(data.charAt(data.length - 2)) > -1))
                        data = data.substring(0, data.length - 1);
                }
            // 其他情况则视作运算符
            else {
                if (!rpn.canOperator(data))
                    return;
                if ('+-×÷*/'.indexOf(dataTail) > -1)
                    data = data.substring(0, data.length - 1);
            }
            data = data + id;
        }
        // 正括号键
        else if (this.data.id2 == id) {
            if (!rpn.canLeftParentheses(data)) return;
            // 式子为0，替换
            if (data == '0')
                data = this.data.id2;
            // 否则追加
            else
                data += id;
        }
        // 反括号键
        else if (this.data.id3 == id) {
            if (!rpn.canRightParentheses(data)) return;
            // 小数点结尾就替换
            if (dataTail == '.')
                data = data.substring(0, data.length - 1);
            data += id;
        }
        // 小数点键
        else if (this.data.id18 == id) {
            if (!rpn.canDot(data))
                return;
            if ('+-×÷*/('.indexOf(dataTail) > -1)
                data += '0'
            data += id;
        }
        // =键
        else if (id == this.data.id20) {
            // 如果式子是一个0，返回
            if (!rpn.canEqual(data)) return
            // 如果式子以操作符，正括号，小数点结尾，去掉这个符号后计算
            if (this.data.lastIsOperator ||
                dataTail == '(' ||
                dataTail == '.') {
                if (data.length == 1) {
                    data = '0';
                } else {
                    data = data.substring(0, data.length - 1)
                }
            }
            var log = data;
            tempLog = data + "=";
            data = rpn.calCommonExp(data);
            if (data == Infinity) data = '+∞';
            if (data == -Infinity) data = '-∞';
            log = log + '=' + data;
            this.data.logs.push(log);
            wx.setStorageSync('callogs', this.data.logs);
            this.setData({
                isResult: true
            })
        }
        // 数字键
        else {
            if (dataTail == ')')
                return;
            if (data == '0') data = id;
            else data += id;
        }
        this.setData({
            screenData: data,
            tempLog: tempLog
        })
    }
})